package com.lin.carbon.controller;

import com.lin.carbon.common.Result;
import com.lin.carbon.service.SysAccountService;
import com.lin.carbon.utils.JwtUtils;
import com.lin.carbon.utils.RedisUtils;
import com.lin.carbon.service.SysAccountService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * 登录控制器，处理用户登录请求
 */
@RestController
public class LoginController {

    // 自定义登录失败异常类
    public static class LoginFailedException extends RuntimeException {
        /**
         * 构造函数，用于创建登录失败异常对象
         * @param message 异常信息
         */
        public LoginFailedException(String message) {
            super(message);
        }
    }

    private static final Logger logger = LoggerFactory.getLogger(LoginController.class);
    // 注入系统账户服务类，用于处理账户相关业务逻辑
    @Autowired
    private SysAccountService sysAccountService;
    // 注入 JwtUtils 工具类，用于生成和验证 JWT Token
    @Autowired
    private JwtUtils jwtUtils;

    // 注入 RedisUtils 工具类，用于操作 Redis 黑名单
    @Autowired
    private RedisUtils redisUtils;
    /**
     * 处理用户登录请求
     * @param accountName 用户账户名
     * @param password 用户密码
     * @return 统一响应对象，包含登录结果信息
     */
    @PostMapping("/login")
    public Result<String> login(@RequestParam String accountName, @RequestParam String password) {
        // 调用服务层方法进行登录验证，获取 JWT 令牌
        String token = sysAccountService.login(accountName, password);
        if (token != null) {
            // 登录成功，返回包含 JWT 令牌的成功响应
            return Result.success(token);
        }
        // 登录失败，抛出登录失败异常，由全局异常处理器处理
        throw new LoginFailedException("登录失败，账户名或密码错误");
    }

    /**
     * 处理用户登出请求
     * @param token 请求头中的 JWT Token
     * @return 封装了登出结果的 Result 对象
     */
    @PostMapping("/carbon/logout")
    public Result<String> logout(@RequestHeader("Authorization") String token) {
        // 调用 JwtUtils 的 getTokenExpiration 方法获取 Token 的过期时间
        if (token.startsWith("Bearer ")) {
            token = token.substring(7);
        }
        logger.info("Accept logout JWT token: {}", token); // 添加请求到达日志
        long expirationTime = jwtUtils.getTokenExpiration(token);
        if (expirationTime > 0) {
            // 如果过期时间有效，调用 RedisUtils 的 addToBlacklist 方法将 Token 添加到黑名单
            redisUtils.addToBlacklist(token, expirationTime);
        }
        return Result.success("LOGOUT SUCCESS");
    }
}